package com.magina.common.aspect;

import com.magina.common.response.Response;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;

/**
 * 文件名称：ControllerAspect</br>
 * 初始作者： Magina.Hu</br>
 * 创建日期： 2019/4/16</br>
 * 功能说明： 控制层切面, 用于统一拦截接口入参校验异常  <br/>
 * =================================================<br/>
 * 修改记录：<br/>
 * 修改作者 日期 修改内容<br/>
 * ================================================<br/>
 * Copyright (c) 2019-2020 .All rights reserved.<br/>
 */
@Aspect
@Component
@Slf4j
public class ControllerAspect {

    @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
    public void Pointcut() {
    }

    /**
     * 方法描述:   [环绕通知.]</br>
     * 初始作者: Magina.Hu<br/>
     * 创建日期: 2019/4/16 <br/>
     * 开始版本: 1.0.0<br/>
     * =================================================<br/>
     * 修改记录：<br/>
     * 修改作者 日期 修改内容<br/>
     * ================================================<br/>
     * @param   pjp 切点
     * @return  返回数据
     * @throws Exception 异常
     */
    @Around("Pointcut()")
    public Object Around(ProceedingJoinPoint pjp) throws Throwable {
        log.info("Class:" + pjp.getTarget().getClass().getName()+ "/Method:"+pjp.getSignature().getName());
        Object[] args = pjp.getArgs();
        if (args != null && args.length > 0) {
            for (Object obj : args) {
                if (obj instanceof BindingResult) {
                    BindingResult bindResult = (BindingResult) obj;
                    if (bindResult.hasErrors()) {
                        for (ObjectError error : bindResult.getAllErrors()) {
                            return Response.fail(error.getDefaultMessage());
                        }
                    }
                }
            }
        }
        return pjp.proceed();
    }
}
